home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / shells / cshel40a / part02 < prev    next >
Encoding:
Internet Message Format  |  1991-02-07  |  50.8 KB

  1. Path: news.larc.nasa.gov!amiga-request
  2. From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v91i004: CShell 4.02A - alternative command interface, Part02/03
  4. Reply-To: Cesare.Dieni@p1.f602.n332.z2.fidonet.org (Cesare Dieni)
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v91i004@ab20.larc.nasa.gov>
  7. References: <comp.sources.amiga:v91i003@ab20.larc.nasa.gov>
  8. Date: 07 Feb 91 00:54:43 GMT
  9. Approved: tadguy@uunet.UU.NET (Tad Guy)
  10. X-Mail-Submissions-To: amiga@uunet.uu.net
  11. X-Post-Discussions-To: comp.sys.amiga.misc
  12.  
  13. Submitted-by: Cesare.Dieni@p1.f602.n332.z2.fidonet.org (Cesare Dieni)
  14. Posting-number: Volume 91, Issue 004
  15. Archive-name: shells/cshell-4.02a/part02
  16.  
  17. #!/bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 2 (of 3)."
  24. # Contents:  src/comm1.c src/comm3.c src/execom.c
  25. # Wrapped by tadguy@ab20 on Wed Feb  6 19:54:19 1991
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'src/comm1.c' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'src/comm1.c'\"
  29. else
  30. echo shar: Extracting \"'src/comm1.c'\" \(16572 characters\)
  31. sed "s/^X//" >'src/comm1.c' <<'END_OF_FILE'
  32. X/*
  33. X * COMM1.C
  34. X *
  35. X * Matthew Dillon, August 1986
  36. X *
  37. X * Version 2.07M by Steve Drew 10-Sep-87
  38. X *
  39. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  40. X *
  41. X */
  42. X
  43. X#define DIR_SHORT 0x01
  44. X#define DIR_FILES 0x02
  45. X#define DIR_DIRS  0x04
  46. X#define DIR_NOCOL 0x08
  47. X#define DIR_NAMES 0x10
  48. X
  49. Xextern int has_wild;
  50. X
  51. X/*
  52. X    Parse the options specified in sw[]
  53. X    Setting a bit in global variable options
  54. X    for each one found
  55. X*/
  56. X
  57. Xget_opt(sw,count)
  58. Xchar *sw;
  59. Xint *count;
  60. X{
  61. Xregister char *c,*s;
  62. Xunsigned int l,i = 0;
  63. X
  64. Xoptions=0;
  65. Xwhile((++i < ac) && (av[i][0] == '-')) {
  66. X    for (c = av[i]+1; *c ; c++) {
  67. X        for(l = 0,s = sw;*s && *s != *c; ++s) ++l;
  68. X        if (*s) options |= (1 << l);
  69. X        }
  70. X    }
  71. X*count = i;
  72. X}
  73. X
  74. Xdo_sleep()
  75. X{
  76. Xregister int i;
  77. X
  78. Xif (ac == 2) for (i=atoi(av[1]); i>0 && !CHECKBREAK(); i-=2) Delay(100L);
  79. Xreturn 0;
  80. X}
  81. X
  82. Xdo_protect()
  83. X{
  84. Xregister long mask=0xf;
  85. Xregister char *s, *p;
  86. Xstatic char flags[]="DEWRAPSH";
  87. Xregister unsigned short i;
  88. X
  89. Xfor (s=av[--ac]; *s; s++)
  90. X    if (p=index(flags, toupper(*s))) mask^=(1 << (p-flags));
  91. X    else ierror(av[ac],500);
  92. Xfor (i=1; i<ac; i++) if (!SetProtection(av[i],mask)) pError(av[i]);
  93. Xreturn 0;
  94. X}
  95. X
  96. Xdo_filenote()
  97. X{
  98. Xchar *note=av[--ac];
  99. Xregister unsigned int i;
  100. X
  101. Xfor (i=1; i<ac; i++) if (!SetComment(av[i], note)) pError(av[i]);
  102. Xreturn 0;
  103. X}
  104. X
  105. Xdo_cat()
  106. X{
  107. XFILE *fopen(), *fi;
  108. Xregister unsigned int lctr;
  109. Xunsigned int i;
  110. Xchar buf[256];
  111. X
  112. Xget_opt("n",&i);
  113. Xif (i>=ac) {
  114. X    if (has_wild) { printf("No files matching\n"); return 20; }
  115. X    lctr=0;
  116. X    while (gets(buf) && !dobreak()) {
  117. X        if (options) printf("%4d ",++lctr);
  118. X        puts(buf);
  119. X        }
  120. X    }
  121. Xfor (; i<ac; i++)
  122. X    if (fi = fopen (av[i], "r")) {
  123. X        lctr=0;
  124. X        while (fgets(buf,256,fi) && !dobreak()) {
  125. X            if (options) printf("%4d ",++lctr);
  126. X            printf("%s",buf);
  127. X            }
  128. X        fclose (fi);
  129. X        }
  130. X    else pError(av[i]);
  131. Xreturn 0;
  132. X}
  133. X
  134. Xdo_info()
  135. X{
  136. XBPTR lock;
  137. Xstruct InfoData *info;
  138. Xlong size, free, percent;
  139. Xchar *p, buf[130], *state;
  140. Xstruct DirectoryEntry *de_head=NULL, *de;
  141. X
  142. Xinfo=(struct InfoData *)AllocMem((long)sizeof(struct InfoData),MEMF_PUBLIC);
  143. XAddDADevs(&de_head, DLF_DEVICES | DLF_DISKONLY );
  144. XMyprocess->pr_WindowPtr = (APTR)(-1);
  145. Xprintf ("Unit  Size  Bytes  Used Blk/By-Free Full Errs  Status    Name\n");
  146. Xfor (de=de_head; de; de=de->de_Next) {
  147. X    printf("%-5s",de->de_Name);
  148. X    if (lock=Lock(de->de_Name,ACCESS_READ)) {
  149. X        if (Info(lock, info)) {
  150. X        if(info->id_NumBlocks)
  151. X            percent=(info->id_NumBlocksUsed * 100)/info->id_NumBlocks;
  152. X        else
  153. X            percent=0;
  154. X        PathName(lock, buf, 128L);
  155. X        if (p=index(buf,':')) *p = '\0';
  156. X        size = ((info->id_NumBlocks + 2)* info->id_BytesPerBlock)/ 1024;
  157. X        free = (((info->id_NumBlocks-info->id_NumBlocksUsed))*
  158. X               info->id_BytesPerBlock)/ 1024;
  159. X        switch(info->id_DiskState) {
  160. X            case ID_WRITE_PROTECTED: state="Read Only "; break;
  161. X            case ID_VALIDATED:     state="Read/Write"; break;
  162. X            case ID_VALIDATING:     state="Validating"; break;
  163. X            }
  164. X        printf("%4ld%c%6ld%7ld%7ld%4ld%c%4ld%%%4ld  %s %s\n",
  165. X            (size>1024) ? ((size+512) >> 10) : size,
  166. X            (size>1024) ? 'M' : 'K',
  167. X            info->id_BytesPerBlock,
  168. X            info->id_NumBlocksUsed,
  169. X            info->id_NumBlocks-info->id_NumBlocksUsed,
  170. X            (free>1024) ? ((free+512) >> 10) : free,
  171. X            (free>1024) ? 'M' : 'K',
  172. X            (info->id_NumBlocksUsed * 100)/info->id_NumBlocks,
  173. X            info->id_NumSoftErrors,
  174. X            state,
  175. X            buf);
  176. X        }
  177. X        else pError (de->de_Name);
  178. X        UnLock(lock);
  179. X        }
  180. X    else puts("  No disk present");
  181. X    }
  182. XFreeDAList(&de_head);
  183. XMyprocess->pr_WindowPtr = NULL;
  184. XFreeMem(info,(long)sizeof(struct InfoData));
  185. Xreturn 0;
  186. X}
  187. X
  188. X/* things shared with display_file */
  189. X
  190. XBPTR lastlock;
  191. Xint filecount, col;
  192. Xlong bytes, blocks;
  193. X
  194. X/*
  195. X * the args passed to do_dir will never be expanded
  196. X */
  197. Xdo_dir()
  198. X{
  199. Xint i, c, eac;
  200. Xchar **eav;
  201. X
  202. Xcol = filecount = 0;
  203. Xbytes = blocks = 0L;
  204. Xlastlock=NULL;
  205. X
  206. Xget_opt("sfdcn",&i);
  207. X
  208. Xif (ac == i) { ++ac; av[i]=""; }
  209. Xif (!(options & (DIR_FILES | DIR_DIRS))) options|=(DIR_FILES | DIR_DIRS);
  210. X
  211. Xfor (; i<ac && !CHECKBREAK(); ++i)
  212. X    if (eav = expand(av[i], &eac)) {
  213. X        QuickSort(eav, eac);
  214. X        for(c=0; c<eac && !CHECKBREAK(); ++c)
  215. X            if (options & DIR_NAMES)
  216. X                puts(eav[c]);
  217. X            else
  218. X                display_file(eav[c]);
  219. X        free_expand (eav);
  220. X        }
  221. Xif (col) printf("\n");
  222. Xif (filecount>1) {
  223. X    blocks += filecount; /* account for dir blocks */
  224. X    printf(" %ld Blocks, %ld Bytes used in %d files\n",
  225. X        blocks, bytes, filecount);
  226. X    }
  227. Xif (lastlock) UnLock(lastlock);
  228. Xreturn 0;
  229. X}
  230. X
  231. Xdisplay_file(filestr)
  232. Xchar *filestr;
  233. X{
  234. Xlong atol();
  235. Xint isadir,slen;
  236. Xchar sc, *fi, *base, buf[130];
  237. XBPTR thislock;
  238. X
  239. Xbase=BaseName(filestr);
  240. Xsc = *base;
  241. X*base = '\0';
  242. Xthislock=Lock(filestr,SHARED_LOCK);
  243. X/* if (thislock==NULL) return; */
  244. Xif (lastlock==NULL || CompareLock(thislock,lastlock)) {
  245. X    if (col) printf("\n");
  246. X    col = 0;
  247. X    PathName(thislock, buf, 128L);
  248. X    printf("Directory of %s\n", buf);
  249. X    if (lastlock) UnLock(lastlock);
  250. X    lastlock=thislock;
  251. X    }
  252. Xelse UnLock(thislock);
  253. X*base = sc;
  254. Xslen = strlen(base);
  255. Xfi = base + slen + 1;
  256. Xisadir = (fi[12] =='D');
  257. X
  258. Xif (!(((options & DIR_FILES) && !isadir) ||
  259. X    ((options & DIR_DIRS) &&  isadir)))
  260. X        return;
  261. Xif (isadir && !(options & DIR_NOCOL)) printf ("\23333m");
  262. Xif (options & DIR_SHORT) {
  263. X    if (col==3 && slen>18) { printf("\n"); col = 0; }
  264. X    if (slen>18) { printf(" %-37s",base); col+= 2; }
  265. X        else { printf(" %-18s",base); col++; }
  266. X    if (col > 3) { printf("\n"); col=0; }
  267. X    }
  268. Xelse printf("   %-24s %s",base ,fi);
  269. Xif (isadir && !(options & DIR_NOCOL)) printf("\2330m");
  270. Xfi[16] = fi[21] = '\0';
  271. Xbytes  += atol(fi+10);
  272. Xblocks += atol(fi+17);
  273. Xfilecount++;
  274. X}
  275. X
  276. Xdo_quit()
  277. X{
  278. Xif (Src_stack) {
  279. X    Quit = 1;
  280. X    return(do_return());
  281. X    }
  282. Xmain_exit(0);
  283. X}
  284. X
  285. Xdo_echo()
  286. X{
  287. Xint i;
  288. X
  289. Xget_opt("n",&i);
  290. Xfor ( ; i<ac; i++) {
  291. X    printf("%s", av[i]);
  292. X    if (i != ac-1) printf(" ");
  293. X    }
  294. Xif (!options) printf("\n");
  295. Xreturn 0;
  296. X}
  297. X
  298. X/* gets a line from file, joining two lines if the first ends in '\' */
  299. X
  300. Xchar *myfgets(buf, buflen, file)
  301. Xchar *buf;
  302. XFILE *file;
  303. X{
  304. Xchar *bufptr=buf, *limit=buf+buflen;
  305. X
  306. Xdo {
  307. X    if (fgets(bufptr, limit-bufptr, file)==NULL) {
  308. X        if (bufptr != buf)
  309. X            fprintf(stderr,"Source: file ends in '\\'\n");
  310. X        return NULL;
  311. X        }
  312. X    bufptr = bufptr+strlen(bufptr)-2;
  313. X    } while (*bufptr=='\\');
  314. Xreturn buf;
  315. X}
  316. X
  317. Xdo_source(str)
  318. Xchar *str;
  319. X{
  320. Xregister FILE *fi;
  321. Xchar buf[256];
  322. Xint len;
  323. X
  324. Xif (Src_stack == MAXSRC) {
  325. X    ierror(NULL,217);
  326. X    return -1;
  327. X    }
  328. Xif ((fi = fopen (av[1], "r")) == 0) { pError(av[1]); return -1;    }
  329. Xset_var(LEVEL_SET, v_passed, next_word(next_word(str)));
  330. X++H_stack;
  331. XSrc_pos[Src_stack] = 0;
  332. XSrc_base[Src_stack] = (long)fi;
  333. X++Src_stack;
  334. Xwhile (myfgets (buf, 256, fi) && !dobreak()) {
  335. X    len = strlen(buf);
  336. X    buf[len-1] = '\0';
  337. X    Src_pos[Src_stack - 1] += len;
  338. X    if (Verbose && !forward_goto) fprintf(stderr,"%s\n",buf);
  339. X    exec_command (buf);
  340. X    }
  341. X--H_stack;
  342. X--Src_stack;
  343. Xif (forward_goto) ierror(NULL,501);
  344. Xforward_goto = 0;
  345. Xunset_level(LEVEL_LABEL + Src_stack);
  346. Xunset_var(LEVEL_SET, v_gotofwd);
  347. Xunset_var(LEVEL_SET, v_passed);
  348. Xfclose (fi);
  349. Xreturn 0;
  350. X}
  351. X
  352. X/*
  353. X * set process cwd name and $_cwd, if str != NULL also print it.
  354. X */
  355. Xdo_pwd(str)
  356. Xchar *str;
  357. X{
  358. Xchar pwd[130];
  359. X
  360. XPathName(Myprocess->pr_CurrentDir, pwd, 128L);
  361. Xif (str) puts(pwd);
  362. Xset_var(LEVEL_SET, v_cwd, pwd);
  363. X/* put the current dir name in our CLI task structure */
  364. XCtoBStr(pwd, Mycli->cli_SetName, 128L);
  365. Xreturn 0;
  366. X}
  367. X
  368. X/*
  369. X * CD
  370. X *
  371. X * CD(str, 0)      -do CD operation.
  372. X *
  373. X */
  374. X
  375. Xdo_cd(str)
  376. Xchar *str;
  377. X{
  378. XBPTR oldlock, filelock;
  379. X
  380. Xstr=next_word(str);
  381. Xif (!strcmp("..",str)) str="/";
  382. Xfilelock=Lock(str,ACCESS_READ);
  383. Xif (filelock==NULL) { pError(str); return 20; }
  384. Xif (!isdir(str)) { UnLock(filelock); ierror(str,212); return 20; }
  385. Xif (oldlock=CurrentDir(filelock)) UnLock(oldlock);
  386. Xdo_pwd(NULL);
  387. Xreturn 0;
  388. X}
  389. X
  390. Xdo_mkdir()
  391. X{
  392. Xregister unsigned int i;
  393. XBPTR lock;
  394. X
  395. Xfor (i=1; i<ac; ++i) {
  396. X    if (exists(av[i])) ierror(av[i],203);
  397. X    else if (lock=CreateDir(av[i])) UnLock (lock);
  398. X    else pError(av[i]);
  399. X    }
  400. Xreturn 0;
  401. X}
  402. X
  403. Xdo_mv()
  404. X{
  405. Xchar *dest, buf[256];
  406. Xint dirflag;
  407. Xregister unsigned int i;
  408. X
  409. Xdirflag=isdir(dest=av[--ac]);
  410. Xif (ac>3 && !dirflag) { ierror(dest, 507); return (-1); }
  411. Xfor (i=1; i<ac; ++i) {
  412. X    strcpy(buf, dest);
  413. X    if (dirflag) TackOn(buf, BaseName(av[i]));
  414. X    if (Rename(av[i], buf)==0)
  415. X        { pError(av[i]); return -1; }
  416. X    }
  417. Xreturn 0;
  418. X}
  419. X
  420. Xint dirstoo;
  421. X
  422. Xall_args(args, action, dirsflag)
  423. Xchar *args;
  424. Xint (*action)();
  425. X{
  426. Xunsigned int i;
  427. X
  428. Xget_opt(args, &i);
  429. Xdirstoo=dirsflag;
  430. Xfor (; i<ac && !dobreak(); ++i)
  431. X    if (isdir(av[i])) {
  432. X        if (options & 1) recurse(av[i], action);
  433. X            else if (dirstoo) (*action)(av[i]);
  434. X        }
  435. X    else (*action)(av[i]);
  436. Xreturn 0;
  437. X}
  438. X
  439. Xchar *searchstring;
  440. X
  441. Xsearch_file(s)
  442. Xchar *s;
  443. X{
  444. XFILE *fopen(), *fi;
  445. Xregister char *p;
  446. Xregister unsigned int
  447. X    nocasedep, lctr, len, excl=((options & 16) !=0 ), yesno;
  448. Xchar buf[256], lowbuf[256], searchit[256], first;
  449. X
  450. Xif (strcmp("STDIN",s)) fi=fopen(s,"r"); else fi=stdin;
  451. Xif (fi==NULL) { pError(s); return; }
  452. Xnocasedep=!(options & 2);
  453. Xlctr=0;
  454. Xif (!(options & 32)) printf("Examining %s...\n",s);
  455. Xstrcpy(searchit,searchstring);
  456. Xif (options & 4) strcat(searchit,"\n");
  457. Xlen=strlen(searchit);
  458. Xif (nocasedep) strupr(searchit);
  459. Xfirst=*searchit;
  460. Xwhile (fgets(buf,256,fi) && !dobreak()) {
  461. X    lctr++;
  462. X    if (options & 4) yesno=compare_ok(searchit, buf, options & 2);
  463. X    else {
  464. X        if (nocasedep) {
  465. X            strcpy(lowbuf,buf);
  466. X            strupr(lowbuf);
  467. X            p=lowbuf;
  468. X            }
  469. X        else p=buf;
  470. X        while ((p=index(p,first)) && strncmp(p++,searchit,len)) ;
  471. X        yesno= (p!=NULL);
  472. X        }
  473. X    if (yesno ^ excl) {
  474. X            /* default: print line numbers */
  475. X        if (!(options & 8)) printf("%4d ",lctr);
  476. X        printf("%s",buf);
  477. X        }
  478. X    }
  479. Xif (fi!=stdin) fclose (fi);
  480. X}
  481. X
  482. Xdo_search()
  483. X{
  484. Xsearchstring=av[--ac];
  485. Xall_args("rcwneq", search_file, 0);
  486. Xreturn 0;
  487. X}
  488. X
  489. Xrm_file(file)
  490. Xchar *file;
  491. X{
  492. Xif (has_wild) printf(" %s...",file);
  493. Xif (options & 2) SetProtection(file,0L);
  494. Xif (!DeleteFile(file)) pError (file); else if (has_wild) printf("Deleted\n");
  495. X}
  496. X
  497. Xdo_rm()
  498. X{
  499. Xall_args("rp", rm_file, 1);
  500. Xreturn 0;
  501. X}
  502. X
  503. Xrecurse(name, action)
  504. Xchar *name;
  505. Xint (*action)();
  506. X{
  507. Xregister BPTR lock, cwd;
  508. Xregister FIB *fib=(FIB *)AllocMem((long)sizeof(FIB),MEMF_PUBLIC);
  509. Xchar *namecopy=malloc(256);
  510. X
  511. Xif (name[0] =='\0') return;
  512. Xnamecopy[0]=0;
  513. Xif (lock=Lock(name,ACCESS_READ)) {
  514. X    cwd =CurrentDir(lock);
  515. X    if (Examine(lock, fib))
  516. X    while (ExNext(lock, fib) && !CHECKBREAK()) {
  517. X        if (*namecopy) { (*action)(namecopy); namecopy[0]=0; }
  518. X        if (fib->fib_DirEntryType>=0) recurse(fib->fib_FileName,action);
  519. X        else strcpy(namecopy,fib->fib_FileName);
  520. X        }
  521. X    if (*namecopy) (*action)(namecopy);
  522. X    UnLock(CurrentDir(cwd));
  523. X    if (dirstoo) (*action)(name);
  524. X    }
  525. Xelse pError(name);
  526. Xfree(namecopy);
  527. XFreeMem(fib, (long)sizeof(FIB));
  528. X}
  529. X
  530. Xdo_history()
  531. X{
  532. Xregister struct HIST *hist;
  533. Xint i = H_tail_base;
  534. Xint len = (av[1]) ? strlen(av[1]) : 0;
  535. X
  536. Xfor (hist = H_tail; hist && !dobreak(); hist = hist->prev)
  537. X    if (len == 0 || !strncmp(av[1], hist->line, len))
  538. X        printf("%3d %s\n", i++, hist->line);
  539. Xreturn 0;
  540. X}
  541. X
  542. Xdo_mem()
  543. X{
  544. Xlong cfree, ffree;
  545. Xextern long AvailMem();
  546. X
  547. XForbid();
  548. Xcfree = AvailMem (MEMF_CHIP);
  549. Xffree = AvailMem (MEMF_FAST);
  550. XPermit();
  551. Xif (ffree) printf ("FAST memory: %ld\nCHIP memory: %ld\n", ffree, cfree);
  552. Xprintf("Total  Free: %ld\n", cfree+ffree);
  553. Xreturn 0;
  554. X}
  555. X
  556. Xdo_forline()
  557. X{
  558. Xchar vname[33], buf[256];
  559. Xregister unsigned short lctr;
  560. XFILE *f;
  561. Xchar *cstr;
  562. X
  563. Xstrcpy(vname,av[1]);
  564. Xf=fopen(av[2],"r");
  565. Xif (f==NULL) pError(av[2]);
  566. Xlctr=0;
  567. X++H_stack;
  568. Xcstr = compile_av (av, 3, ac, ' ', 0);
  569. Xwhile (fgets(buf,256,f) && !dobreak()) {
  570. X    buf[strlen(buf)-1]='\0';    /* remove CR */
  571. X    lctr++;
  572. X    set_var(LEVEL_SET, vname, buf);
  573. X    sprintf(buf,"%d",lctr);
  574. X    set_var(LEVEL_SET, v_linenum, buf);
  575. X    exec_command(cstr);
  576. X    }
  577. Xfclose(f);
  578. X--H_stack;
  579. Xfree (cstr);
  580. Xunset_var (LEVEL_SET, vname);
  581. Xunset_var (LEVEL_SET, v_linenum);
  582. Xreturn 0;
  583. X}
  584. X
  585. Xdo_fornum()
  586. X{
  587. Xchar vname[33], buf[16];
  588. Xint n1, n2, step, i, verbose;
  589. Xchar *cstr;
  590. X
  591. Xget_opt("vs",&i);
  592. Xverbose=(options & 1);
  593. Xstrcpy(vname,av[i++]);
  594. Xn1=myatoi(av[i++],-32767,32767); if (atoierr) return 20;
  595. Xn2=myatoi(av[i++],-32767,32767); if (atoierr) return 20;
  596. Xif (options & 2) {
  597. X    step=myatoi(av[i++],-32767,32767); if (atoierr) return 20;
  598. X    }
  599. Xelse
  600. X    step=1;
  601. X++H_stack;
  602. Xcstr = compile_av (av, i, ac, ' ', 0);
  603. Xfor (i=n1; (step>=0 ? i<=n2 : i>=n2) && !CHECKBREAK(); i+=step) {
  604. X    if (verbose) fprintf(stderr, "fornum: %d\n", i);
  605. X    sprintf(buf,"%d",i);
  606. X    set_var (LEVEL_SET, vname, buf);
  607. X    exec_command(cstr);
  608. X    }
  609. X--H_stack;
  610. Xfree (cstr);
  611. Xunset_var (LEVEL_SET, vname);
  612. Xreturn 0;
  613. X}
  614. X
  615. X/*
  616. X * foreach var_name  ( str str str str... str ) commands
  617. X * spacing is important (unfortunately)
  618. X *
  619. X * ac=0    1 2 3 4 5 6 7
  620. X * foreach i ( a b c ) echo $i
  621. X * foreach i ( *.c ) "echo -n "file ->";echo $i"
  622. X */
  623. X
  624. Xdo_foreach()
  625. X{
  626. Xregister int cstart, cend;
  627. Xregister char *cstr;
  628. Xchar **fav;
  629. Xchar vname[33];
  630. Xint i, verbose;
  631. X
  632. Xget_opt("v",&i);
  633. Xverbose=(options & 1);
  634. Xstrcpy(vname, av[i++]);
  635. Xif (*av[i] == '(') i++;
  636. Xcstart = i;
  637. Xwhile (i<ac && *av[i] != ')') i++;
  638. Xif (i > ac) { fprintf(stderr,"')' expected\n"); return 20; }
  639. X++H_stack;
  640. Xcend = i;
  641. X
  642. Xfav = (char **)malloc(sizeof(char *) * (ac));
  643. Xcstr = compile_av (av, cend + 1, ac, ' ', 0);
  644. X
  645. Xfor (i = cstart; i < cend; ++i) fav[i] = av[i];
  646. X
  647. Xfor (i = cstart; i<cend && !CHECKBREAK(); ++i) {
  648. X    set_var (LEVEL_SET, vname, fav[i]);
  649. X    if (verbose) fprintf(stderr, "foreach: %s\n", fav[i]);
  650. X    exec_command(cstr);
  651. X    }
  652. X--H_stack;
  653. Xfree (fav);
  654. Xfree (cstr);
  655. Xunset_var (LEVEL_SET, vname);
  656. Xreturn 0;
  657. X}
  658. X
  659. Xdo_forever(str)
  660. Xchar *str;
  661. X{
  662. Xint rcode = 0;
  663. Xchar *ptr = next_word(str);
  664. X
  665. X++H_stack;
  666. Xfor (;;) {
  667. X    if (CHECKBREAK()) { rcode = 20; break; }
  668. X    if (exec_command (ptr) < 0) {
  669. X        str = get_var(LEVEL_SET, v_lasterr);
  670. X        rcode = (str) ? atoi(str) : 20;
  671. X        break;
  672. X        }
  673. X    }
  674. X--H_stack;
  675. Xreturn rcode;
  676. X}
  677. X
  678. Xdo_exec(str)
  679. Xchar *str;
  680. X{
  681. Xreturn exec_command(next_word(str));
  682. X}
  683. X
  684. Xextern struct Window *w;
  685. Xextern struct IntuitionBase *IntuitionBase;
  686. X
  687. Xdo_window()
  688. X{
  689. Xlong x, y, maxwidth, maxheight, arg[5];
  690. Xunsigned int i;
  691. Xstruct Screen *screen;
  692. Xstruct Window *window;
  693. X
  694. Xget_opt("slfbaq", &i);
  695. Xif (options & 1)
  696. X    SizeWindow(w, (long)(w->MinWidth-w->Width), (long)(w->MinHeight-w->Height));
  697. Xif (options & 2) {
  698. X    x=-w->LeftEdge;
  699. X    y=-w->TopEdge;
  700. X    MoveWindow(w,x,y);
  701. X    x=IntuitionBase->ActiveScreen->Width -w->Width;
  702. X    y=IntuitionBase->ActiveScreen->Height-w->Height;
  703. X    SizeWindow(w,x,y);
  704. X    }
  705. Xif (options & 4) WindowToFront(w);
  706. Xif (options & 8) WindowToBack(w);
  707. Xif (options & 16) ActivateWindow(w);
  708. Xif(ac >= 5) {
  709. X    for(i=1; i<5; i++) {
  710. X        arg[i] = myatoi(av[i],0,1023); if (atoierr) return 20;
  711. X        }
  712. X    maxwidth = w->WScreen->Width;
  713. X    maxheight= w->WScreen->Height;
  714. X    if (arg[3] > maxwidth - arg[1] || arg[4] > maxheight- arg[2]) {
  715. X        ierror(NULL, 500);
  716. X        return 20;
  717. X        }
  718. X    x = -w->LeftEdge;
  719. X    y = -w->TopEdge;
  720. X    MoveWindow(w, x, y);
  721. X    x = arg[3] - w->Width;
  722. X    y = arg[4] - w->Height;
  723. X    SizeWindow(w, x, y);
  724. X    x = arg[1];
  725. X    y = arg[2];
  726. X    MoveWindow(w, x, y);
  727. X    }
  728. Xif(options & 32) {
  729. X    for (screen=IntuitionBase->FirstScreen; screen; screen=screen->NextScreen) {
  730. X        printf("\nScreen \"%s\" (%d,%d,%dx%d):\n",
  731. X            screen->Title,
  732. X            screen->LeftEdge,
  733. X            screen->TopEdge,
  734. X            screen->Width,
  735. X            screen->Height
  736. X            );
  737. X        for (window=screen->FirstWindow; window; window=window->NextWindow) {
  738. X        printf("\tWindow\t\"%s\" (%d,%d,%dx%d)\n",
  739. X            window->Title,
  740. X            window->LeftEdge,
  741. X            window->TopEdge,
  742. X            window->Width,
  743. X            window->Height
  744. X            );
  745. X        }
  746. X        }
  747. X    return 0;
  748. X    }
  749. XDelay(25L); /* pause 1/2 sec. before trying to print */
  750. Xprintf("\014");
  751. Xreturn 0;
  752. X}
  753. X
  754. Xsetsystemtime(ds)
  755. Xstruct DateStamp *ds;
  756. X{
  757. Xstruct timerequest tr;
  758. Xlong secs= ds->ds_Days*86400 + ds->ds_Minute*60 + ds->ds_Tick/TICKS_PER_SECOND;
  759. X
  760. Xif (OpenDevice(TIMERNAME, UNIT_VBLANK, &tr, 0L)) {
  761. X    fprintf(stderr,"Clock error: can't open timer device\n");
  762. X    return;
  763. X    }
  764. Xtr.tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
  765. Xtr.tr_node.io_Message.mn_Node.ln_Pri = 0L;
  766. Xtr.tr_node.io_Message.mn_Node.ln_Name = NULL;
  767. Xtr.tr_node.io_Message.mn_ReplyPort = NULL;
  768. Xtr.tr_node.io_Command = TR_SETSYSTIME;
  769. Xtr.tr_time.tv_secs = secs;
  770. Xtr.tr_time.tv_micro = 0L;
  771. Xif (DoIO (&tr)) fprintf(stderr,"Clock error: can't talk to timer device\n");
  772. XCloseDevice (&tr);
  773. X}
  774. X
  775. Xchar tday[10];
  776. X
  777. Xchar *dates(dss)
  778. Xstruct DateStamp *dss;
  779. X{
  780. Xstatic char timestr[40];
  781. Xchar tdate[10], ttime[10];
  782. Xstruct DateTime dt;
  783. Xstruct DateStamp *myds=&(dt.dat_Stamp);
  784. X
  785. Xdt.dat_Format=FORMAT_DOS;
  786. Xdt.dat_StrDay=tday;
  787. Xdt.dat_StrDate=tdate;
  788. Xdt.dat_StrTime=ttime;
  789. Xdt.dat_Flags=NULL;
  790. Xmyds->ds_Days=dss->ds_Days;
  791. Xmyds->ds_Minute=dss->ds_Minute;
  792. Xmyds->ds_Tick=dss->ds_Tick;
  793. XStamptoStr(&dt);
  794. Xsprintf(timestr,"%s %s\n",tdate,ttime);
  795. Xtimestr[18]='\n';
  796. Xtimestr[19]='\0';    /* protection against bad timestamped files */
  797. Xreturn timestr;
  798. X}
  799. X
  800. Xdo_date()
  801. X{
  802. Xstruct DateStamp dss;
  803. Xregister unsigned short i;
  804. Xstruct DateTime dt;
  805. X
  806. Xdt.dat_Format=FORMAT_DOS;
  807. Xif (ac==1) {
  808. X    DateStamp(&dss);
  809. X    printf("%s %s",tday,dates(&dss));
  810. X    }
  811. Xelse {
  812. X    DateStamp(& (dt.dat_Stamp));
  813. X    for (i=1; i<ac; i++) {
  814. X        dt.dat_StrDate=NULL;
  815. X        dt.dat_StrTime=NULL;
  816. X        dt.dat_Flags=DTF_FUTURE;
  817. X        if (index(av[i],':')) dt.dat_StrTime=av[i];
  818. X            else dt.dat_StrDate=av[i];
  819. X        if (StrtoStamp(&dt)) ierror(av[i],500);
  820. X        }
  821. X    setsystemtime( & (dt.dat_Stamp) );
  822. X    }
  823. Xreturn 0;
  824. X}
  825. END_OF_FILE
  826. if test 16572 -ne `wc -c <'src/comm1.c'`; then
  827.     echo shar: \"'src/comm1.c'\" unpacked with wrong size!
  828. fi
  829. # end of 'src/comm1.c'
  830. fi
  831. if test -f 'src/comm3.c' -a "${1}" != "-c" ; then 
  832.   echo shar: Will not clobber existing file \"'src/comm3.c'\"
  833. else
  834. echo shar: Extracting \"'src/comm3.c'\" \(13753 characters\)
  835. sed "s/^X//" >'src/comm3.c' <<'END_OF_FILE'
  836. X/*
  837. X * COMM3.C
  838. X *
  839. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  840. X *
  841. X */
  842. X
  843. Xdo_tee()
  844. X{
  845. Xchar buf[256];
  846. X
  847. Xwhile (gets(buf)) {
  848. X    puts(buf);
  849. X    fprintf(stderr, "%s\n", buf);
  850. X    }
  851. X}
  852. X
  853. Xdo_head(garbage, com)
  854. Xchar *garbage;
  855. X{
  856. Xint i, n;
  857. XFILE *f;
  858. Xchar buf[256];
  859. X
  860. Xif (ac>2) {
  861. X    n=(int)(long)Atol(av[2]);
  862. X    if (IoErr()) {
  863. X        ierror(av[2],511);
  864. X        return 20;
  865. X        }
  866. X    }
  867. Xelse n=10;
  868. Xf=fopen(av[1], "r");
  869. Xif (f==NULL) {
  870. X    pError(av[1]);
  871. X    return 20;
  872. X    }
  873. Xif (com) {    /* tail specific part */
  874. X    i=0;
  875. X    while (fgets(buf, 256, f) && ! dobreak()) i++;
  876. X    rewind(f);
  877. X    if (n>i) n=i;
  878. X    i=i-n;
  879. X    while (i-- && fgets(buf, 256, f) && ! dobreak()) ;
  880. X    }
  881. Xfor (i=1; i<=n && fgets(buf, 256, f) && ! dobreak(); i++)
  882. X    printf("%s", buf);
  883. Xfclose(f);
  884. Xreturn 0;
  885. X}
  886. X
  887. Xman(f, s)
  888. XFILE *f;
  889. Xchar *s;
  890. X{
  891. Xchar buf[256], entry[256];
  892. Xint len=sprintf(entry, "    %s", s);
  893. X
  894. Xrewind(f);
  895. Xdo    /* look for required argument */
  896. X    if (fgets(buf, 256, f) == NULL) {
  897. X        fprintf(stderr, "Help not found for %s\n", s);
  898. X        return;
  899. X        }
  900. Xwhile ( Strncmp(entry, buf, len) );
  901. Xdo {    /* display help */
  902. X    printf("%s", buf);
  903. X    if (fgets(buf, 256, f) == NULL) return;
  904. X    }
  905. Xwhile ( ( ! isalphanum(*buf) ) && strncmp(buf, "    ", 4) );
  906. X}
  907. X
  908. Xdo_man()
  909. X{
  910. XFILE *f;
  911. Xregister unsigned int i = 1;
  912. X
  913. Xf=fopen("DOC:Shell.doc", "r");
  914. Xif (f==NULL) {
  915. X    fprintf(stderr, "You must assign directory DOC:, and copy Shell.doc there\n");
  916. X    return 20;
  917. X    }
  918. Xfor (i=1; i<ac; i++) man(f, av[i]);
  919. Xif (ac==1) man(f, "MAN");
  920. Xfclose(f);
  921. Xreturn 0;
  922. X}
  923. X
  924. Xdo_assign()
  925. X{
  926. Xswitch(ac) {
  927. X    case 1:  assignlist();
  928. X         break;
  929. X    case 2:  doassign(av[1], NULL);
  930. X         break;
  931. X    case 3:  doassign(av[1], av[2]);
  932. X         break;
  933. X    default: ierror(NULL, 500);
  934. X         break;
  935. X    }
  936. Xreturn 0;
  937. X}
  938. X
  939. Xchar *assign_errors[4]={
  940. X    "",
  941. X    "Name %s is not valid\n",
  942. X    "Weird error\n",
  943. X    "Can't cancel %s\n"
  944. X    };
  945. X
  946. Xdoassign(log, phy)
  947. Xchar *log, *phy;
  948. X{
  949. Xint last=strlen(log) - 1;
  950. X
  951. Xif (log[last] != ':') fprintf(stderr, "Bad name %s\n", log);
  952. Xelse {
  953. X    log[last] = 0;
  954. X    fprintf(stderr,assign_errors[Assign(log, phy)],phy);
  955. X    }
  956. X}
  957. X
  958. Xassignlist()
  959. X{
  960. Xstruct DirectoryEntry *de_head=NULL, *de;
  961. Xchar buf[256];
  962. XBPTR lock;
  963. Xint ctr=0;
  964. X
  965. XAddDADevs(&de_head, DLF_DEVICES | DLF_VOLUMES | DLF_DIRS);
  966. Xprintf("Devices:\n");
  967. Xfor (de=de_head; de && de->de_Type==DLX_DEVICE; de=de->de_Next) {
  968. X    printf("%-8s",de->de_Name);
  969. X    if (ctr++ == 5) { ctr=0; printf("\n"); }
  970. X    }
  971. Xprintf("\n\nVolumes:\n");
  972. Xfor (    ;
  973. X    de && (de->de_Type==DLX_VOLUME || de->de_Type==DLX_UNMOUNTED);
  974. X    de=de->de_Next
  975. X    )
  976. X    printf( "%-16s %s\n",
  977. X        de->de_Name,
  978. X        de->de_Type == DLX_VOLUME ? "[Mounted]" : ""
  979. X        );
  980. Xprintf("\nDirectories:\n");
  981. Xfor (; de && de->de_Type==DLX_ASSIGN; de=de->de_Next) {
  982. X    if (lock=Lock(de->de_Name, ACCESS_READ)) {
  983. X        PathName(lock, buf, 256L);
  984. X        UnLock(lock);
  985. X        }
  986. X    else
  987. X        strcpy(buf,"Unexisting lock");
  988. X    printf("%-20s%s\n",de->de_Name,buf);
  989. X    }
  990. XFreeDAList(&de_head);
  991. X}
  992. X
  993. Xdo_join()
  994. X{
  995. XBPTR sou, dest;
  996. Xchar *buffer;
  997. Xunsigned int i;
  998. Xlong n;
  999. Xchar *namedest=av[--ac];
  1000. X
  1001. Xget_opt("r", &i);
  1002. Xif (options==0 && exists(namedest)) { ierror(namedest,203); return 20; }
  1003. Xif ( (buffer=malloc(8192)) == NULL ) { ierror(NULL,103); return 20; }
  1004. Xif ( (dest=Open(namedest, MODE_NEWFILE)) == NULL )
  1005. X    { pError(namedest); goto fail1; }
  1006. Xfor (i=1; i<ac; i++) {
  1007. X    if ( (sou=Open(av[i], MODE_OLDFILE)) == NULL ) pError(av[i]);
  1008. X    else
  1009. X        while( (n=Read(sou, buffer, 8192L)) > 0 )
  1010. X            if (Write(dest, buffer, n) != n)
  1011. X                { pError(namedest); Close(sou); goto fail2; }
  1012. X    Close(sou);
  1013. X    }
  1014. Xfail2:
  1015. X    Close(dest);
  1016. Xfail1:
  1017. X    free(buffer);
  1018. X    return 0;
  1019. X}
  1020. X
  1021. X#define BUFDIM 512L
  1022. X#define MAXSTR 256
  1023. X
  1024. Xint minstr;
  1025. X
  1026. Xstrings_in_file(s)
  1027. Xchar *s;
  1028. X{
  1029. Xchar c;
  1030. Xchar readbuf[BUFDIM+1], strbuf[MAXSTR+1];
  1031. Xregister unsigned int i, strctr=0;
  1032. XBPTR fh;
  1033. Xint out, n;
  1034. X
  1035. Xif ( fh=Open(s, MODE_OLDFILE) ) {
  1036. X    fprintf(stderr, "Strings in %s (len>=%d):\n",s,minstr);
  1037. X    while ( (n=(int)Read(fh, readbuf, BUFDIM)) > 0 && !CHECKBREAK() )
  1038. X        for (i=0; i<n; i++) {
  1039. X        c=readbuf[i];
  1040. X        if (c<0x20 || c>0x7f) {
  1041. X            out=(strctr>=minstr);
  1042. X            if (!out) strctr=0;
  1043. X            }
  1044. X        else {
  1045. X            strbuf[strctr++]=c;
  1046. X            out=(strctr>=BUFDIM);
  1047. X            }
  1048. X        if (out) {
  1049. X            strbuf[strctr]='\0';
  1050. X            puts(strbuf);
  1051. X            strctr=0;
  1052. X            }
  1053. X        }
  1054. X    Close(fh);
  1055. X    }
  1056. Xelse pError(s);
  1057. X}
  1058. X
  1059. Xdo_strings()
  1060. X{
  1061. Xminstr=myatoi(av[--ac],1,255);
  1062. Xall_args("r", strings_in_file, 0);
  1063. Xreturn 0;
  1064. X}
  1065. X
  1066. XBPTR myfile[MAXMYFILES];
  1067. X
  1068. Xdo_open()
  1069. X{
  1070. Xlong mode;
  1071. Xunsigned int n;
  1072. X
  1073. Xswitch (toupper(av[2][0])) {
  1074. X    case 'R': mode=MODE_OLDFILE; break;
  1075. X    case 'W': mode=MODE_NEWFILE; break;
  1076. X    default : ierror(NULL,500); return;
  1077. X    }
  1078. Xn=(unsigned int)myatoi(av[3],0,MAXMYFILES-1); if (atoierr) return 20;
  1079. Xif (myfile[n]) myclose(n);
  1080. Xmyfile[n]=Open(av[1],mode);
  1081. Xreturn (myfile[n]==NULL);
  1082. X}
  1083. X
  1084. Xdo_close()
  1085. X{
  1086. Xregister unsigned int i;
  1087. Xint n;
  1088. X
  1089. Xif (ac==1)
  1090. X    for (i=1; i<MAXMYFILES; i++)
  1091. X        myclose(i);
  1092. Xfor (i=1; i<ac; i++) {
  1093. X    n=myatoi(av[i],0,MAXMYFILES-1); if (atoierr) return 20;
  1094. X    myclose(n);
  1095. X    }
  1096. Xreturn 0;
  1097. X}
  1098. X
  1099. Xmyclose(n)
  1100. X{
  1101. Xif (myfile[n]) { Close(myfile[n]); myfile[n]=NULL; }
  1102. X}
  1103. X
  1104. Xdo_fileslist()
  1105. X{
  1106. Xregister unsigned short i;
  1107. Xint flag=0;
  1108. X
  1109. Xprintf("Open files:");
  1110. Xfor (i=0; i<MAXMYFILES; i++)
  1111. X    if (myfile[i]) { printf(" %d",i); flag=1; }
  1112. Xif (!flag) printf(" None!");
  1113. Xprintf("\n");
  1114. Xreturn 0;
  1115. X}
  1116. X
  1117. XBPTR extOpen(name,mode)
  1118. Xchar *name;
  1119. Xlong mode;
  1120. X{
  1121. Xif (name[0]=='.') return myfile[atoi(name+1)];
  1122. Xreturn Open(name,mode);
  1123. X}
  1124. X
  1125. XextClose(fh)
  1126. XBPTR fh;
  1127. X{
  1128. Xregister unsigned short i;
  1129. X
  1130. Xfor (i=0; i<MAXMYFILES; i++)
  1131. X    if (myfile[i]==fh) return;
  1132. XClose(fh);
  1133. X}
  1134. X
  1135. Xdo_basename()
  1136. X{
  1137. Xset_var(LEVEL_SET, av[1], BaseName(av[2]));
  1138. Xreturn 0;
  1139. X}
  1140. X
  1141. Xdo_tackon()
  1142. X{
  1143. Xchar buf[256];
  1144. X
  1145. Xstrcpy(buf, av[2]);
  1146. XTackOn(buf, av[3]);
  1147. Xset_var(LEVEL_SET, av[1], buf);
  1148. Xreturn 0;
  1149. X}
  1150. X
  1151. Xdo_resident()
  1152. X{
  1153. Xunsigned int i;
  1154. Xregister struct ResidentProgramNode *p;
  1155. Xchar buf[256];
  1156. X
  1157. Xget_opt("ard", &i);
  1158. Xif (options==0 && ac>1) options=1;
  1159. Xswitch (options) {
  1160. X    case 0:
  1161. X    ObtainSemaphore (& (ArpBase->ResPrgProtection) );
  1162. X    if (p=ArpBase->ResidentPrgList) {
  1163. X        printf("Name             Users Access\n");
  1164. X        for (; p; p=p->rpn_Next)
  1165. X            printf("%-17s%5d%6d\n",
  1166. X                p->rpn_Name, p->rpn_Usage, p->rpn_AccessCnt);
  1167. X        }
  1168. X    else printf("No resident program(s)\n");
  1169. X    ReleaseSemaphore(& (ArpBase->ResPrgProtection) );
  1170. X    break;
  1171. X    case 1:
  1172. X    for (; i<ac; i++)
  1173. X        if (loadres(av[i]))
  1174. X            printf("OK! %s is now resident\n", BaseName(av[i]));
  1175. X        else pError(av[i]);
  1176. X    break;
  1177. X    case 2:
  1178. X    for (; i<ac; i++)
  1179. X        if (RemResidentPrg(av[i])) ierror(av[i],202);
  1180. X        else printf("Removed %s\n",av[i]);
  1181. X    break;
  1182. X    case 4:
  1183. X    for (; i<ac; i++) {
  1184. X        sprintf(buf,"res_%s",av[i]);
  1185. X        Setenv(buf,"1");
  1186. X        }
  1187. X    break;
  1188. X    default:
  1189. X    ierror(NULL,500);
  1190. X    break;
  1191. X    }
  1192. Xreturn 0;
  1193. X}
  1194. X
  1195. Xint loadres(s)
  1196. Xchar *s;
  1197. X{
  1198. XBPTR seg;
  1199. X
  1200. Xif (seg=(BPTR)LoadPrg(s)) AddResidentPrg(seg,BaseName(s));
  1201. Xreturn (seg != NULL);
  1202. X}
  1203. X
  1204. Xstruct ProcessControlBlock pcb={
  1205. X    4000,        /* pcb_StackSize    */
  1206. X    0,        /* pcb_Pri        */
  1207. X    };
  1208. X/* remaining field are NULL */
  1209. X    
  1210. Xdo_truerun(avline, backflag)
  1211. Xchar *avline;
  1212. X{
  1213. Xchar name[200];
  1214. Xchar *FindIt();
  1215. X
  1216. Xif (backflag) {
  1217. X    pcb.pcb_Control=NULL;
  1218. X    pcb.pcb_Input=pcb.pcb_Output=Open("NIL:",MODE_OLDFILE);
  1219. X    }
  1220. Xelse {
  1221. X    pcb.pcb_Control=NULL;
  1222. X    pcb.pcb_Input=pcb.pcb_Output =NULL;
  1223. X    }
  1224. Xif (FindIt(av[1], "", name))
  1225. X    ASyncRun(name,next_word(next_word(avline)),&pcb);
  1226. Xelse
  1227. X    ierror(av[1],205);
  1228. Xreturn 0;
  1229. X}
  1230. X
  1231. Xint exists(name)
  1232. Xchar *name;
  1233. X{
  1234. XBPTR lock;
  1235. X
  1236. Xif (lock=Lock(name,ACCESS_READ)) {
  1237. X    UnLock(lock);
  1238. X    return 1;
  1239. X    }
  1240. Xreturn 0;
  1241. X}
  1242. X
  1243. Xdo_aset()
  1244. X{
  1245. XSetenv(av[1],av[2]);
  1246. Xreturn 0;
  1247. X}
  1248. X
  1249. X#define HTYPELINE 16L
  1250. X
  1251. Xhtype_a_file(s)
  1252. Xchar *s;
  1253. X{
  1254. XBPTR fh;
  1255. Xlong n, filesize=0;
  1256. Xchar buf[HTYPELINE+1];
  1257. Xregister unsigned short i;
  1258. X
  1259. Xif ( (fh=Open(s,MODE_OLDFILE))==NULL ) { pError(s); return 20; }
  1260. Xwhile ( (n=Read(fh,buf,HTYPELINE))>0 && !dobreak()) {
  1261. X    printf("%06lx: ",filesize);
  1262. X    filesize+=n;
  1263. X    for (i=0; i<n; i++) {
  1264. X        printf( (i&3) ? "%02x" : " %02x",(int)(unsigned char)buf[i]);
  1265. X        if (buf[i]<0x20) buf[i]='.';
  1266. X        }
  1267. X    for ( ; i<HTYPELINE; i++) {
  1268. X        printf( (i&3) ? "  " : "   ");
  1269. X        buf[i]=' ';
  1270. X        }
  1271. X    buf[i]=0;
  1272. X    printf("    %s\n",buf);
  1273. X    }
  1274. XClose(fh);
  1275. Xreturn 0;
  1276. X}
  1277. X
  1278. Xdo_htype()
  1279. X{
  1280. Xall_args("", htype_a_file, 0);
  1281. Xreturn 0;
  1282. X}
  1283. X
  1284. Xdo_stack()
  1285. X{
  1286. Xlong n;
  1287. X
  1288. Xif (ac>1) {
  1289. X    n=Atol(av[1]);
  1290. X    if (!IoErr()) Mycli->cli_DefaultStack=(long)(n >> 2L);
  1291. X    }
  1292. Xelse printf("current stack size is %ld bytes\n",
  1293. X                (long)Mycli->cli_DefaultStack << 2L);
  1294. Xreturn 0;
  1295. X}
  1296. X
  1297. Xdo_fault()
  1298. X{
  1299. Xstruct PERROR *p;
  1300. Xregister unsigned int i;
  1301. Xint n;
  1302. X
  1303. Xfor (i=1; i<ac; i++) {
  1304. X    n=myatoi(av[i],0,32767);
  1305. X    if (!atoierr) {
  1306. X        for (p=Perror; p->errnum && p->errnum!=n; p++);
  1307. X        if (p->errnum)
  1308. X            printf("Fault %d: %s\n",n,p->errstr);
  1309. X        else
  1310. X            printf("Fault %d not recognized\n",n);
  1311. X        }
  1312. X    }
  1313. Xreturn 0;
  1314. X}
  1315. X
  1316. Xstruct rpncommand {
  1317. X    char *str;
  1318. X    int parsin, parsout;
  1319. X    };
  1320. X
  1321. Xstruct rpncommand rpn[]={
  1322. X    "+",    2,    1,
  1323. X    "-",    2,    1,
  1324. X    "*",    2,    1,
  1325. X    "/",    2,    1,
  1326. X    "%",    2,    1,
  1327. X    "&",    2,    1,
  1328. X    "|",    2,    1,
  1329. X    "~",    1,    1,
  1330. X    ">",    2,    1,
  1331. X    "<",    2,    1,
  1332. X    "==",    2,    1,
  1333. X    "!",    1,    1,
  1334. X    "DUP",    1,    2,
  1335. X    "DROP",    1,    0,
  1336. X    "SWAP",    2,    2,
  1337. X    "HELP",    0,    0,
  1338. X    NULL,    0,    1,    /* this looks for a number */
  1339. X};
  1340. X
  1341. Xdo_rpn(garbage,ifflag) /* ifflag!=0 if called from if */
  1342. Xchar *garbage;
  1343. X{
  1344. Xregister long n0, n1;
  1345. Xlong t;
  1346. Xunsigned int i, j;
  1347. Xint sp=0;
  1348. Xlong stack[100];
  1349. Xstruct rpncommand *temp;
  1350. X
  1351. Xi=1;
  1352. Xif (ifflag) get_opt("rn",&i);
  1353. Xfor (; i<ac; i++) {
  1354. X    for (j=0; rpn[j].str && Strcmp(rpn[j].str,av[i]); j++) ;
  1355. X    n0=stack[sp-1];
  1356. X    n1=stack[sp-2];
  1357. X    sp -= (rpn[j].parsin);
  1358. X    if (sp<0) { fprintf(stderr, "RPN: Empty stack\n"); return 1; }
  1359. X    switch (j) {
  1360. X      case 0:    n0 += n1;        break;
  1361. X      case 1:    n0 = n1-n0;        break;
  1362. X      case 2:    n0 *= n1;        break;
  1363. X      case 3:    n0 = n1/n0;        break;
  1364. X      case 4:    n0 = n1%n0;        break;
  1365. X      case 5:    n0 &= n1;        break;
  1366. X      case 6:    n0 |= n1;        break;
  1367. X      case 7:    n0 =  ~n0;        break;
  1368. X      case 8:    n0 = (n1 > n0);        break;
  1369. X      case 9:    n0 = (n1 < n0);        break;
  1370. X      case 10:    n0 = (n0 == n1);    break;
  1371. X      case 11:    n0 = !n0;        break;
  1372. X      case 12:    n1=n0;            break;
  1373. X      case 13:    t=n0; n0=n1; n1=t;    break;
  1374. X      case 14:                break;
  1375. X      case 15:    printf("In Commands Out\n");
  1376. X            for (temp=rpn; temp->str; temp++)
  1377. X                printf(" %d %-10s%d\n",
  1378. X                temp->parsin,temp->str,temp->parsout);
  1379. X            break;
  1380. X      default:    n0=Atol(av[i]);
  1381. X            if (IoErr()) {
  1382. X                fprintf(stderr, "Bad RPN cmd: %s\n",av[i]);
  1383. X                return 20;
  1384. X                }
  1385. X            break;
  1386. X      }
  1387. X    stack[sp]=n0;
  1388. X    stack[sp+1]=n1;
  1389. X    sp += rpn[j].parsout;
  1390. X    }
  1391. Xif (ifflag) return (int)(stack[sp-1]);    /* called from if: return top value */
  1392. Xfor (i=sp-1;(int)i>=0;i--) printf("%ld\n", stack[i]); /* else print stack */
  1393. Xreturn 0;
  1394. X}
  1395. X
  1396. Xdo_path()
  1397. X{
  1398. Xunion {    long *lp; long ll; } l;
  1399. Xchar buf[256];
  1400. X
  1401. Xputs("Current dir");
  1402. Xl.lp = (long *) Mycli->cli_CommandDir;
  1403. Xwhile (l.ll) {
  1404. X    l.ll <<= 2;
  1405. X    PathName(l.lp[1], buf, 256L);
  1406. X    puts(buf);
  1407. X    l.ll = *l.lp;
  1408. X    }
  1409. Xputs("C:");
  1410. Xreturn 0;
  1411. X}
  1412. X
  1413. Xdo_pri()
  1414. X{
  1415. Xint t, pri;
  1416. Xstruct Process *proc;
  1417. X
  1418. Xt=(int)(long)FindCLI(0L);
  1419. Xt=myatoi(av[1],0,t); if (atoierr) return 20;
  1420. Xpri=myatoi(av[2],-128,127); if (atoierr) return 20;
  1421. XForbid();
  1422. Xproc=(t==0 ? Myprocess : FindCLI((long)t));
  1423. Xif (proc==NULL) fprintf(stderr, "process not found\n");
  1424. X    else SetTaskPri(proc, (long)pri);
  1425. XPermit();
  1426. Xreturn 0;
  1427. X}
  1428. X
  1429. Xdo_strleft()
  1430. X{
  1431. Xchar buf[256];
  1432. Xint n;
  1433. X
  1434. Xstrcpy(buf,av[2]);
  1435. Xn=myatoi(av[3],1,strlen(buf)); if (atoierr) return 20;
  1436. Xbuf[n]='\0';
  1437. Xset_var(LEVEL_SET, av[1], buf);
  1438. Xreturn 0;
  1439. X}
  1440. X
  1441. Xdo_strright()
  1442. X{
  1443. Xchar buf[256];
  1444. Xint n;
  1445. X
  1446. Xstrcpy(buf, av[2]);
  1447. Xn=myatoi(av[3],1,strlen(buf)); if (atoierr) return 20;
  1448. Xset_var(LEVEL_SET, av[1], buf+strlen(buf)-n);
  1449. Xreturn 0;
  1450. X}
  1451. X
  1452. Xdo_strmid()
  1453. X{
  1454. Xchar buf[256];
  1455. Xint n1, n2;
  1456. X
  1457. Xstrcpy(buf, av[2]);
  1458. Xn1=myatoi(av[3],1,strlen(buf))-1; if (atoierr) return 20;
  1459. Xif (ac>4) {
  1460. X    n2=myatoi(av[4],1,strlen(buf)-n1); if (atoierr) return 20;
  1461. X    buf[n1+n2]='\0';
  1462. X    }
  1463. Xset_var(LEVEL_SET, av[1], buf+n1);
  1464. Xreturn 0;
  1465. X}
  1466. X
  1467. Xdo_strlen()
  1468. X{
  1469. Xchar buf[16];
  1470. X
  1471. Xsprintf(buf,"%d",strlen(av[2]));
  1472. Xset_var(LEVEL_SET, av[1], buf);
  1473. Xreturn 0;
  1474. X}
  1475. X
  1476. Xint atoierr;
  1477. X
  1478. Xmyatoi(s,min,max)
  1479. Xchar *s;
  1480. X{
  1481. Xint n;
  1482. X
  1483. Xn=(int)(long)Atol(s);
  1484. Xif (atoierr=IoErr())
  1485. X    ierror(s,511);
  1486. X    else if (n<min || n>max) {
  1487. X        atoierr=1;
  1488. X        fprintf(stderr, "%s(%d) not in (%d,%d)\n",s,n,min,max);
  1489. X        }
  1490. Xreturn n;
  1491. X}
  1492. X
  1493. Xdo_fltlower()
  1494. X{
  1495. Xchar buf[256];
  1496. Xchar *strlwr();
  1497. X
  1498. Xwhile (!CHECKBREAK() && gets(buf)) puts(strlwr(buf));
  1499. Xreturn 0;
  1500. X}
  1501. X
  1502. Xdo_fltupper()
  1503. X{
  1504. Xchar buf[256];
  1505. Xchar *strupr();
  1506. X
  1507. Xwhile (!CHECKBREAK() && gets(buf)) puts(strupr(buf));
  1508. Xreturn 0;
  1509. X}
  1510. X
  1511. Xdo_uniq()
  1512. X{
  1513. Xint firstline=1;
  1514. Xchar buf[256], oldbuf[256];
  1515. X
  1516. Xwhile (!CHECKBREAK() && gets(buf)) {
  1517. X    if ( firstline || strcmp(buf, oldbuf)) {
  1518. X        strcpy(oldbuf, buf);
  1519. X        puts(buf);
  1520. X        }
  1521. X    firstline=0;
  1522. X    }
  1523. Xreturn 0;
  1524. X}
  1525. X
  1526. X#define RXFB_RESULT  17
  1527. X
  1528. Xstatic struct rexxmsg {
  1529. X    struct Message cm_Node;
  1530. X    LONG   RFU1;
  1531. X    LONG   RFU2;
  1532. X    LONG   rm_Action;
  1533. X    LONG   rm_Result1;
  1534. X    LONG   rm_Result2;
  1535. X    char   *cm_Args[16];
  1536. X    LONG   RFU7;
  1537. X    LONG   RFU8;
  1538. X    LONG   RFU9;
  1539. X    LONG   RFU10;
  1540. X    LONG   RFU11;
  1541. X    LONG   RFU12;
  1542. X} mymsg;
  1543. X
  1544. Xdo_rxsend()
  1545. X{
  1546. Xint i=1, resflag;
  1547. Xchar *result;
  1548. Xstruct MsgPort *port, *reply;
  1549. Xlong len;
  1550. X
  1551. Xget_opt("r", &i);
  1552. Xresflag=options;
  1553. Xif (!(port = FindPort(av[i++]))) { fprintf(stderr, "No port %s!\n", av[--i]); return 20; }
  1554. Xmymsg.cm_Node.mn_Node.ln_Type = NT_MESSAGE;
  1555. Xmymsg.cm_Node.mn_Length = sizeof(struct rexxmsg);
  1556. Xmymsg.rm_Action = (resflag ? 1L << RXFB_RESULT : 0);
  1557. Xif (!(reply = CreatePort(NULL, 0L))) {
  1558. X    fprintf(stderr, "No reply port\n");
  1559. X    return 20;
  1560. X    }
  1561. Xmymsg.cm_Node.mn_ReplyPort = reply;
  1562. X
  1563. Xfor ( ; i<ac; i++) {
  1564. X    mymsg.cm_Args[0] = av[i];
  1565. X    mymsg.rm_Result2 = 0;    /* clear out the last result. */
  1566. X    PutMsg(port, &mymsg.cm_Node);
  1567. X    WaitPort(reply);
  1568. X
  1569. X    if (resflag) {
  1570. X        result=(char *)mymsg.rm_Result2;
  1571. X        len=*( (long *)(result-4) );
  1572. X        if (len<0 || len>256)
  1573. X            fprintf(stderr, "Risultato troppo lungo\n");
  1574. X        else
  1575. X            printf("%s\n", result);
  1576. X        FreeMem(result, len);
  1577. X        }
  1578. X    }
  1579. X
  1580. Xif (reply) DeletePort(reply);
  1581. Xreturn 0;
  1582. X}
  1583. X
  1584. Xdo_rxrec()
  1585. X{
  1586. Xstruct MsgPort *port;
  1587. Xstruct rexxmsg *msg;
  1588. Xchar *portname, *str;
  1589. X
  1590. Xif (ac > 1)
  1591. X    portname=av[1];
  1592. Xelse
  1593. X    portname="rexx_csh";
  1594. X
  1595. Xport=CreatePort(portname, 0L);
  1596. Xif (port==NULL) {
  1597. X    fprintf(stderr, "Can't have MsgPort %s\n", portname);
  1598. X    return 20;
  1599. X    }
  1600. Xfor (;;) {
  1601. X    WaitPort(port);
  1602. X    while (msg=(struct rexxmsg *)GetMsg(port)) {
  1603. X        if ( ! Strcmp(msg->cm_Args[0], "bye")) {
  1604. X            ReplyMsg((struct Message *)msg);
  1605. X            DeletePort(port);
  1606. X            return 0;
  1607. X            }
  1608. X        exec_command(msg->cm_Args[0]);
  1609. X        if (msg->rm_Action & (1L << RXFB_RESULT)) {
  1610. X            str = get_var(LEVEL_SET, v_lasterr);
  1611. X            msg->rm_Result2=(str) ? atoi(str) : 20;
  1612. X            }
  1613. X        ReplyMsg((struct Message *)msg);
  1614. X        }
  1615. X    }
  1616. X}
  1617. END_OF_FILE
  1618. if test 13753 -ne `wc -c <'src/comm3.c'`; then
  1619.     echo shar: \"'src/comm3.c'\" unpacked with wrong size!
  1620. fi
  1621. # end of 'src/comm3.c'
  1622. fi
  1623. if test -f 'src/execom.c' -a "${1}" != "-c" ; then 
  1624.   echo shar: Will not clobber existing file \"'src/execom.c'\"
  1625. else
  1626. echo shar: Extracting \"'src/execom.c'\" \(16435 characters\)
  1627. sed "s/^X//" >'src/execom.c' <<'END_OF_FILE'
  1628. X/*
  1629. X * EXECOM.C
  1630. X *
  1631. X * Matthew Dillon, 10 August 1986
  1632. X *    Finally re-written.
  1633. X *
  1634. X * Version 2.07M by Steve Drew 10-Sep-87
  1635. X *
  1636. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  1637. X *
  1638. X */
  1639. X
  1640. X#define F_EXACT 0
  1641. X#define F_ABBR  1
  1642. X
  1643. X#define ST_COND   0x01
  1644. X#define ST_NORED  0x02
  1645. X#define ST_NOEXP  0x04
  1646. X#define ST_AV     0x08 /* delimit args within a variable */
  1647. X
  1648. Xint has_wild = 0;                 /* set if any arg has wild card */
  1649. X
  1650. Xstruct COMMAND {
  1651. X    int (*func)();
  1652. X    short minargs;
  1653. X    short stat;
  1654. X    int val;
  1655. X    char *name;
  1656. X    };
  1657. X
  1658. Xextern char *format_insert_string();
  1659. Xextern char *mpush(), *exarg();
  1660. X
  1661. Xextern int do_uniq(), do_man(), do_head(), do_tee();
  1662. Xextern int do_basename(), do_tackon();
  1663. Xextern int do_fltupper(), do_fltlower();
  1664. Xextern int do_strleft(), do_strright(), do_strmid(), do_strlen();
  1665. Xextern int do_fornum(), do_forline(), do_exec();
  1666. Xextern int do_diskchange(), do_stack(), do_fault(), do_path(), do_pri();
  1667. Xextern int do_rpn(), do_resident(), do_truerun(), do_aset(), do_howmany();
  1668. Xextern int do_open(), do_close(), do_fileslist(), do_htype();
  1669. Xextern int do_run(), do_number(), do_assign(), do_join();
  1670. Xextern int do_quit(), do_set_var(), do_unset_var();
  1671. Xextern int do_echo(), do_source(), do_mv(), do_addbuffers();
  1672. Xextern int do_cd(), do_pwd(), do_rm(), do_mkdir(), do_history();
  1673. Xextern int do_mem(), do_cat(), do_dir(), do_info(), do_inc();
  1674. Xextern int do_foreach(), do_return(), do_if(), do_label(), do_goto();
  1675. Xextern int do_input(), do_ver(), do_sleep(), do_help();
  1676. Xextern int do_strhead(), do_strtail(), do_relabel();
  1677. Xextern int do_copy(), do_date(), do_protect(), do_ps();
  1678. Xextern int do_forever(), do_abortline(), do_strings(), do_touch();
  1679. Xextern int do_window(), do_search(), do_filenote(), do_rxrec(), do_rxsend();
  1680. Xchar *push_cpy();
  1681. X
  1682. Xstatic struct COMMAND Command[] = {
  1683. Xdo_run,        0, ST_AV,    0,    "\001",   /* may call do_source */
  1684. Xdo_abortline,    0, 0,        0,    "abortline",
  1685. Xdo_addbuffers,    2, 0,        0,    "addbuffers",
  1686. Xdo_set_var,    0, 0, LEVEL_ALIAS,    "alias",  /* uses avline */
  1687. Xdo_aset,    1, 0,        0,    "aset",
  1688. Xdo_assign,    0, 0,        0,    "assign",
  1689. Xdo_basename,    2, 0,        0,    "basename",
  1690. Xdo_cat,        0, 0,        0,    "cat",
  1691. Xdo_cd,        0, 0,        0,    "cd",
  1692. Xdo_close,    0, 0,        0,    "close",
  1693. Xdo_copy,    1, 0,        0,    "copy",
  1694. Xdo_copy,    1, 0,        0,    "cp",
  1695. Xdo_date,    0, 0,        0,    "date",
  1696. Xdo_inc,        1, 0,        -1,    "dec",
  1697. Xdo_rm,        0, 0,        0,    "delete",
  1698. Xdo_dir,        0, ST_NOEXP,    0,    "dir",
  1699. Xdo_diskchange,    1, 0,        0,    "diskchange",
  1700. Xdo_echo,    0, 0,        0,    "echo", /* uses avline */
  1701. Xdo_if,        0, ST_COND,    1,    "else",
  1702. Xdo_if,        0, ST_COND,    2,    "endif",
  1703. Xdo_exec,    1, 0,        0,    "exec",
  1704. Xdo_fault,    1, 0,        0,    "fault",
  1705. Xdo_filenote,    2, 0,        0,    "filenote",
  1706. Xdo_fileslist,    0, 0,        0,    "flist",
  1707. Xdo_fltlower,    0, 0,        0,    "fltlower",
  1708. Xdo_fltupper,    0, 0,        0,    "fltupper",
  1709. Xdo_foreach,    3, ST_NORED,    0,    "foreach",
  1710. Xdo_forever,    1, ST_NORED,    0,    "forever",
  1711. Xdo_forline,    3, ST_NORED,    0,    "forline",
  1712. Xdo_fornum,    4, ST_NORED,    0,    "fornum",
  1713. Xdo_goto,    1, 0,        0,    "goto",
  1714. Xdo_head,    1, 0,        0,    "head",
  1715. Xdo_help,    0, 0,        0,    "help",
  1716. Xdo_history,    0, 0,        0,    "history",
  1717. Xdo_howmany,    0, 0,        0,    "howmany",
  1718. Xdo_htype,    1, 0,        0,    "htype",
  1719. Xdo_if,        1, ST_COND|ST_NORED,0,    "if",
  1720. Xdo_inc,        1, 0,        1,    "inc",
  1721. Xdo_info,    0, 0,        0,    "info",
  1722. Xdo_input,    1, 0,        0,    "input",
  1723. Xdo_join,    2, 0,        1,    "join",
  1724. Xdo_label,    1, ST_COND,    0,    "label",
  1725. Xdo_dir,        0, ST_NOEXP,    0,    "ls",
  1726. Xdo_man,        0, 0,        0,    "man",
  1727. Xdo_mkdir,    0, 0,        0,    "md",
  1728. Xdo_mem,        0, 0,        0,    "mem",
  1729. Xdo_mkdir,    0, 0,        0,    "mkdir",
  1730. Xdo_mv,        2, 0,        0,    "mv",
  1731. Xdo_open,    3, 0,        0,    "open",
  1732. Xdo_path,    0, 0,        0,    "path",
  1733. Xdo_pri,        2, 0,        0,    "pri",
  1734. Xdo_protect,    2, 0,        0,    "protect",
  1735. Xdo_ps,        0, 0,        0,    "ps",
  1736. Xdo_pwd,        0, 0,        0,    "pwd",
  1737. Xdo_quit,    0, ST_NORED,    0,    "quit",
  1738. Xdo_truerun,    1, ST_NORED,    1,    "rback",
  1739. Xdo_mv,        2, 0,        0,    "rename",
  1740. Xdo_relabel,    2, 0,        0,    "relabel",
  1741. Xdo_resident,    0, 0,        0,    "resident",
  1742. Xdo_return,    0, 0,        0,    "return",
  1743. Xdo_rm,        0, 0,        0,    "rm",
  1744. Xdo_rpn,        0, ST_NOEXP,    0,    "rpn",
  1745. Xdo_rxrec,    0, 0,        0,    "rxrec",
  1746. Xdo_rxsend,    2, 0,        0,    "rxsend",
  1747. Xdo_truerun,    1, ST_NORED,    0,    "run",
  1748. Xdo_search,    2, 0,        0,    "search",
  1749. Xdo_set_var,    0, ST_AV, LEVEL_SET,    "set",
  1750. Xdo_sleep,    0, 0,        0,    "sleep",
  1751. Xdo_source,    0, ST_NORED|ST_AV, 0,    "source", /* uses avline */
  1752. Xdo_stack,    0, 0,        0,    "stack",
  1753. Xdo_strhead,    3, 0,        0,    "strhead",
  1754. Xdo_strings,    1, 0,        0,    "strings",
  1755. Xdo_strleft,    3, 0,        0,    "strleft",
  1756. Xdo_strlen,    2, 0,        0,    "strlen",
  1757. Xdo_strmid,    3, 0,        0,    "strmid",
  1758. Xdo_strright,    3, 0,        0,    "strright",
  1759. Xdo_strtail,    3, 0,        0,    "strtail",
  1760. Xdo_tackon,    3, 0,        0,    "tackon",
  1761. Xdo_head,    1, 0,        1,    "tail",
  1762. Xdo_tee,        0, 0,        0,    "tee",
  1763. Xdo_touch,    0, 0,        0,    "touch",
  1764. Xdo_cat,        0, 0,        0,    "type",
  1765. Xdo_unset_var,    0, 0, LEVEL_ALIAS,    "unalias",
  1766. Xdo_uniq,    0, 0,        0,    "uniq",
  1767. Xdo_unset_var,    0, 0, LEVEL_SET  ,    "unset",
  1768. Xdo_ver,        0, 0,        0,    "version",
  1769. Xdo_window,    0, ST_NOEXP,    0,    "window",
  1770. X'\0',        0, 0,        0,    NULL
  1771. X};
  1772. X
  1773. Xstatic unsigned char elast;        /* last end delimeter */
  1774. Xstatic char Cin_ispipe, Cout_ispipe;
  1775. X
  1776. Xexec_command(base)
  1777. Xchar *base;
  1778. X{
  1779. Xregister char *scr;
  1780. Xchar buf[32];
  1781. X
  1782. Xif (!H_stack) {
  1783. X    add_history(base);
  1784. X    sprintf(buf, "%d", H_tail_base + H_len);
  1785. X    set_var(LEVEL_SET, v_histnum, buf);
  1786. X    }
  1787. Xscr = malloc((strlen(base) << 2) + 2);
  1788. Xpreformat(base, scr);
  1789. Xreturn (fcomm(scr, 1) ? -1 : 1);
  1790. X}
  1791. X
  1792. Xisalphanum(c)
  1793. Xregister char c;
  1794. X{
  1795. Xreturn (
  1796. X    (c >= '0' && c <= '9') ||
  1797. X    (c >= 'a' && c <= 'z') ||
  1798. X    (c >= 'A' && c <= 'Z') ||
  1799. X    (c == '_')
  1800. X    );
  1801. X}
  1802. X
  1803. Xpreformat(s, d)
  1804. Xregister char *s, *d;
  1805. X{
  1806. Xregister int si, di, qm;
  1807. X
  1808. Xsi = di = qm = 0;
  1809. Xwhile (s[si] == ' ' || s[si] == 9) ++si;
  1810. Xwhile (s[si]) {
  1811. X    if (qm && s[si] != '\"' && s[si] != '\\') {
  1812. X        d[di++] = s[si++] | 0x80;
  1813. X        continue;
  1814. X        }
  1815. X    switch (s[si]) {
  1816. X        case ' ':
  1817. X        case 9:
  1818. X            d[di++] = ' ';
  1819. X            while (s[si] == ' ' || s[si] == 9) ++si;
  1820. X            if (s[si] == 0 || s[si] == '|' || s[si] == ';') --di;
  1821. X            break;
  1822. X        case '*':
  1823. X        case '?':
  1824. X            d[di++] = 0x80;
  1825. X        case '!':
  1826. X            d[di++] = s[si++];
  1827. X            break;
  1828. X        case '#':
  1829. X            d[di++] = '\0';
  1830. X            while (s[si]) ++si;
  1831. X            break;
  1832. X        case ';':
  1833. X        case '|':
  1834. X            d[di++] = s[si++];
  1835. X            while (s[si] == ' ' || s[si] == 9) ++si;
  1836. X            break;
  1837. X        case '\\':
  1838. X            d[di++] = s[++si] | 0x80;
  1839. X            if (s[si]) ++si;
  1840. X            break;
  1841. X        case '\"':
  1842. X            qm = 1 - qm;
  1843. X            ++si;
  1844. X            break;
  1845. X        case '^':
  1846. X            d[di++] = s[++si] & 0x1F;
  1847. X            if (s[si]) ++si;
  1848. X            break;
  1849. X        case '$': /* search end of var name and place false space */
  1850. X            d[di++] = 0x80;
  1851. X            d[di++] = s[si++];
  1852. X            while (isalphanum(s[si])) d[di++] = s[si++];
  1853. X            d[di++] = 0x80;
  1854. X            break;
  1855. X        default:
  1856. X            d[di++] = s[si++];
  1857. X            break;
  1858. X        }
  1859. X    }
  1860. Xd[di++]=0;
  1861. Xd[di]=0;
  1862. Xif (debug) fprintf (stderr,"PREFORMAT: %d :%s:\n", strlen(d), d);
  1863. X}
  1864. X
  1865. Xextern BPTR extOpen();
  1866. X
  1867. X/*
  1868. X * process formatted string.  ' ' is the delimeter.
  1869. X *
  1870. X *    0: check '\0': no more, stop, done.
  1871. X *    1: check $.     if so, extract, format, insert
  1872. X *    2: check alias. if so, extract, format, insert. goto 1
  1873. X *    3: check history or substitution, extract, format, insert. goto 1
  1874. X *
  1875. X *    4: assume first element now internal or disk based command.
  1876. X *
  1877. X *    5: extract each ' ' or 0x80 delimited argument and process, placing
  1878. X *       in av[] list (except 0x80 args appended).  check in order:
  1879. X *
  1880. X *             '$'         insert string straight
  1881. X *             '>'         setup stdout
  1882. X *             '>>'        setup stdout flag for append
  1883. X *             '<'         setup stdin
  1884. X *             '*' or '?'  do directory search and insert as separate args.
  1885. X *
  1886. X *             ';' 0 '|'   end of command.  if '|' setup stdout
  1887. X *                          -execute command, fix stdin and out (|) sets
  1888. X *                           up stdin for next guy.
  1889. X */
  1890. X
  1891. Xfcomm(str, freeok)
  1892. Xregister char *str;
  1893. X{
  1894. Xstatic int alias_count;
  1895. Xint p_alias_count=0, err=0;
  1896. Xchar *istr, *nextstr, *command, *pend_alias=NULL, *temp;
  1897. X
  1898. Xhas_wild = 0;
  1899. X++alias_count;
  1900. Xmpush_base();
  1901. Xif (*str == 0) goto done1;
  1902. X
  1903. Xstep1:
  1904. X
  1905. Xif (alias_count == MAXALIAS || ++p_alias_count == MAXALIAS) {
  1906. X    fprintf(stderr,"Alias Loop\n");
  1907. X    err = 20;
  1908. X    goto done1;
  1909. X    }
  1910. Xistr = NULL;
  1911. Xif (*str >= 0) istr=get_var(LEVEL_ALIAS, str);
  1912. X    /* only if not \command, i.e. bit 7 not set */
  1913. X*str &= 0x7F;
  1914. X    /* remove \ teltail */
  1915. X
  1916. Xif (istr) {
  1917. X    if (*istr == '%') pend_alias = istr;
  1918. X    else {
  1919. X        str = format_insert_string(str, istr, &freeok);
  1920. X        goto step1;
  1921. X        }
  1922. X    }
  1923. X
  1924. Xif (*str == '!') {
  1925. X    char *p, c;
  1926. X
  1927. X    for (p = str; *p && *p != ';' ; ++p);
  1928. X    c = *p;
  1929. X    *p = '\0';
  1930. X    istr = get_history(str);
  1931. X    *p = c;
  1932. X    replace_head(istr);
  1933. X    str = format_insert_string(str, istr, &freeok);
  1934. X    goto step1;
  1935. X    }
  1936. X
  1937. Xnextstr = str;
  1938. Xcommand = exarg(&nextstr);
  1939. Xif (*command == 0) goto done0;
  1940. Xif (
  1941. X    (pend_alias || ! (cmd_stat(command) & ST_COND) ) &&
  1942. X    (disable || forward_goto)
  1943. X    ) {
  1944. X        while (elast && elast != ';' && elast != '|') exarg(&nextstr);
  1945. X        goto done0;
  1946. X    }
  1947. X
  1948. X{
  1949. Xregister char *arg, *ptr, *scr;
  1950. Xshort redir, doexpand, cont, inc;
  1951. X
  1952. Xac = 1;
  1953. Xav[0] = command;
  1954. X
  1955. Xstep5:                                          /* ac = nextac */
  1956. X
  1957. Xif (!elast || elast == ';' || elast == '|') goto stepdone;
  1958. X
  1959. Xav[ac] = '\0';
  1960. Xcont = 1;
  1961. Xdoexpand = redir = inc = 0;
  1962. X
  1963. Xwhile (cont && elast) {
  1964. X   int cstat = cmd_stat(command);
  1965. X
  1966. X   ptr = exarg(&nextstr);
  1967. X   inc = 1;
  1968. X   arg = "";
  1969. X   cont = (elast == 0x80);
  1970. X   switch (*ptr) {
  1971. X   case '<':
  1972. X      redir = -2;
  1973. X   case '>':
  1974. X      if (cstat & (ST_NORED | ST_COND)) {
  1975. X                                                  /* don't extract   */
  1976. X          redir = 0;                              /* <> stuff if its */
  1977. X          arg = ptr;                              /* external cmd.   */
  1978. X          break;
  1979. X      }
  1980. X      ++redir;
  1981. X      arg = ptr + 1;
  1982. X      if (*arg == '>') {
  1983. X         redir = 2;        /* append >> */
  1984. X         ++arg;
  1985. X      }
  1986. X      cont = 1;
  1987. X      break;
  1988. X   case '$':
  1989. X      /* restore args if from set command or pend_alias */
  1990. X      if ((arg = get_var(LEVEL_SET, ptr + 1)) != NULL) {
  1991. X         if (cstat & ST_COND) {
  1992. X            char *tp;
  1993. X            tp = push_cpy(arg);
  1994. X            arg = tp;
  1995. X         }
  1996. X         else {
  1997. X            char *pe, sv;
  1998. X            while (pe = index(arg,0xA0)) {
  1999. X               sv = *pe;
  2000. X               *pe = '\0';
  2001. X               av[ac++] = push_cpy(arg);
  2002. X               *pe = sv;
  2003. X               av[ac] = '\0';
  2004. X               arg = pe+1;
  2005. X            }
  2006. X         }
  2007. X      }
  2008. X      else arg = ptr;
  2009. X      break;
  2010. X   case '*':
  2011. X   case '?':
  2012. X      if ((cstat & ST_NOEXP) == 0) doexpand = 1;
  2013. X      arg = ptr;
  2014. X      break;
  2015. X   default:
  2016. X      arg = ptr;
  2017. X      break;
  2018. X   }
  2019. X
  2020. X   /* Append arg to av[ac] */
  2021. X
  2022. X   for (scr = arg; *scr; ++scr) *scr &= 0x7F;
  2023. X   if (av[ac]) {
  2024. X      register char *old = av[ac];
  2025. X      av[ac] = mpush(strlen(arg)+strlen(av[ac]));
  2026. X      strcpy(av[ac], old);
  2027. X      strcat(av[ac], arg);
  2028. X   } else av[ac] = push_cpy(arg);
  2029. X   if (elast != 0x80) break;
  2030. X}
  2031. X
  2032. X/* process expansion */
  2033. X
  2034. Xif (doexpand) {
  2035. X    char **eav, **ebase;
  2036. X    int eac;
  2037. X
  2038. X    has_wild = 1;
  2039. X    eav = ebase = expand(av[ac], &eac);
  2040. X    inc = 0;
  2041. X    if (eav) {
  2042. X        if (ac + eac + 2 > MAXAV) {
  2043. X            ierror (NULL, 506);
  2044. X            err = 1;
  2045. X            }
  2046. X        else {
  2047. X            QuickSort(eav, eac);
  2048. X            for (; eac; --eac, ++eav) av[ac++] = push_cpy(*eav);
  2049. X            }
  2050. X        free_expand (ebase);
  2051. X        }
  2052. X    }
  2053. X
  2054. X/* process redirection  */
  2055. X
  2056. Xif (redir && !err) {
  2057. X    register char *file = doexpand ? av[--ac] : av[ac];
  2058. X
  2059. X    if (redir < 0) Cin_name = file;
  2060. X    else {
  2061. X        Cout_name = file;
  2062. X        Cout_append = (redir == 2);
  2063. X        }
  2064. X    inc = 0;
  2065. X    }
  2066. X
  2067. X/* check elast for space */
  2068. X
  2069. Xif (inc) {
  2070. X    ++ac;
  2071. X    if (ac + 2 > MAXAV) {
  2072. X        ierror(NULL, 506);
  2073. X        err = 1;    /* error condition */
  2074. X        elast = 0;    /* don't process any more args */
  2075. X        }
  2076. X    }
  2077. Xif (elast == ' ') goto step5;
  2078. X}
  2079. X
  2080. Xstepdone:
  2081. X
  2082. Xav[ac] = NULL;
  2083. X
  2084. X/* process pipes via files */
  2085. X
  2086. Xif (elast == '|' && !err) {
  2087. X    static int which;    /* 0 or 1 in case of multiple pipes */
  2088. X
  2089. X    which = 1 - which;
  2090. X    Cout_name = (which ? Pipe1 : Pipe2);
  2091. X    Cout_ispipe = 1;
  2092. X    }
  2093. X
  2094. Xif (err) goto done0;
  2095. X
  2096. X{
  2097. Xchar save_elast;
  2098. Xchar *compile_av();
  2099. Xregister char *avline;
  2100. Xunsigned char delim = ' ';
  2101. X
  2102. Xsave_elast = elast;
  2103. Xif (pend_alias || (cmd_stat(command) & ST_AV)) delim = 0xA0;
  2104. Xavline = compile_av(av,((pend_alias) ? 1 : 0), ac, delim, 0);
  2105. X
  2106. Xif (pend_alias) {    /* special % alias */
  2107. X    register char *ptr, *scr;
  2108. X
  2109. X    for (ptr = pend_alias; *ptr && *ptr != ' '; ++ptr);
  2110. X    set_var (LEVEL_SET, pend_alias + 1, avline);
  2111. X    free (avline);
  2112. X
  2113. X    scr = malloc((strlen(ptr) << 2) + 2);
  2114. X    preformat (ptr, scr);
  2115. X    fcomm (scr, 1);
  2116. X    unset_var (LEVEL_SET, pend_alias + 1);
  2117. X    }
  2118. Xelse {    /* normal command  */
  2119. X    register int ccno;
  2120. X    long oldcin  = Myprocess->pr_CIS;
  2121. X    long oldcout = Myprocess->pr_COS;
  2122. X    char *Cin_buf;
  2123. X    struct FileHandle *ci;
  2124. X    long oldbuf;
  2125. X
  2126. X    fflush(stdout);
  2127. X    ccno = find_command (command);
  2128. X    if ((Command[ccno].stat & (ST_NORED | ST_COND)) == 0) {
  2129. X        if (Cin_name) {
  2130. X            if ((Cin = (long)extOpen(Cin_name,1005L)) == 0L) {
  2131. X                ierror (NULL, 504);
  2132. X                err = 1;
  2133. X                Cin_name = '\0';
  2134. X                }
  2135. X            else {
  2136. X                Myprocess->pr_CIS = _devtab[stdin->_unit].fd = Cin;
  2137. X                ci = (struct FileHandle *)(((long)Cin)<<2);
  2138. X                Cin_buf = (char *)AllocMem(202L, MEMF_PUBLIC);
  2139. X                oldbuf = ci->fh_Buf;
  2140. X                if (ci->fh_Buf == 0) /* fexec expects a CIS buffer */
  2141. X                    ci->fh_Buf = (long)Cin_buf>>2;
  2142. X                }
  2143. X            }
  2144. X        if (Cout_name) {
  2145. X            if (Cout_append && (Cout =(long)extOpen(Cout_name, 1005L)) )
  2146. X                Seek(Cout, 0L, 1L);
  2147. X            else
  2148. X                Cout = (long)extOpen(Cout_name,1006L);
  2149. X            if (Cout == NULL) {
  2150. X                err = 1;
  2151. X                ierror (NULL, 504);
  2152. X                Cout_name = '\0';
  2153. X                Cout_append = 0;
  2154. X                }
  2155. X            else Myprocess->pr_COS = _devtab[stdout->_unit].fd = Cout;
  2156. X            }
  2157. X        }
  2158. X    if (ac < Command[ccno].minargs + 1) {
  2159. X        ierror (NULL, 500);
  2160. X        err = -1;
  2161. X        }
  2162. X    else if (!err) {
  2163. X        err = (*Command[ccno].func)(avline, Command[ccno].val);
  2164. X        if (err<0) err=20;
  2165. X        }
  2166. X    free (avline);
  2167. X    if (E_stack == 0 && Lastresult != err) {
  2168. X        Lastresult = err;
  2169. X        seterr();
  2170. X        }
  2171. X    if ( ! (Command[ccno].stat & (ST_NORED | ST_COND))) {
  2172. X        if (Cin_name) {
  2173. X            fflush(stdin);
  2174. X            clearerr(stdin);
  2175. X            ci->fh_Buf = oldbuf;
  2176. X            extClose(Cin);
  2177. X            FreeMem(Cin_buf, 202L);
  2178. X            }
  2179. X        if (Cout_name) {
  2180. X            fflush(stdout);
  2181. X            clearerr(stdout);
  2182. X            stdout->_flags &= ~_DIRTY;     /* because of nil: device */
  2183. X            extClose(Cout);
  2184. X            Cout_append = 0;
  2185. X            }
  2186. X        }
  2187. X    Myprocess->pr_CIS =  _devtab[stdin->_unit].fd  = oldcin;
  2188. X    Myprocess->pr_COS =  _devtab[stdout->_unit].fd = oldcout;
  2189. X    }
  2190. X
  2191. Xif (Cin_ispipe && Cin_name) DeleteFile(Cin_name);
  2192. Xif (Cout_ispipe) {
  2193. X    Cin_name = Cout_name;    /* ok to assign.. static name */
  2194. X    Cin_ispipe = 1;
  2195. X    }
  2196. Xelse Cin_name = '\0';
  2197. XCout_name = '\0';
  2198. XCout_ispipe = 0;
  2199. Xelast = save_elast;
  2200. X}
  2201. X
  2202. Xmpop_tobase();    /* free arguments   */
  2203. Xmpush_base();    /* push dummy base  */
  2204. X
  2205. Xdone0:
  2206. X
  2207. Xif (err && E_stack == 0) {
  2208. X    temp = get_var(LEVEL_SET, v_except);
  2209. X    if (err >= (temp ? atoi(temp) : 1)) {
  2210. X        if (temp) {
  2211. X            ++H_stack;
  2212. X            ++E_stack;
  2213. X            exec_command(temp);
  2214. X            --E_stack;
  2215. X            --H_stack;
  2216. X            }
  2217. X        else Exec_abortline = 1;
  2218. X        }
  2219. X    }
  2220. Xif (elast && ! Exec_abortline) err = fcomm(nextstr, 0);
  2221. XExec_abortline = 0;
  2222. Xif (Cin_name) DeleteFile(Cin_name);
  2223. XCin_name = NULL;
  2224. XCin_ispipe = 0;
  2225. X
  2226. Xdone1:
  2227. X
  2228. Xmpop_tobase();
  2229. Xif (freeok) free(str);
  2230. X--alias_count;
  2231. Xreturn err;    /* TRUE = error occured */
  2232. X}
  2233. X
  2234. X
  2235. Xchar *exarg(ptr)
  2236. Xunsigned char **ptr;
  2237. X{
  2238. Xregister unsigned char *start, *end;
  2239. X
  2240. Xstart = end = *ptr;
  2241. Xwhile(*end && *end!=0x80 && *end!=';' && *end!='|' && *end!=' ') ++end;
  2242. Xelast = *end;
  2243. X*end = '\0';
  2244. X*ptr = end + 1;
  2245. Xreturn (char *)start;
  2246. X}
  2247. X
  2248. Xstatic char **Mlist;
  2249. X
  2250. Xmpush_base()
  2251. X{
  2252. Xchar *str;
  2253. X
  2254. Xstr = malloc(5);
  2255. X*(char ***)str = Mlist;
  2256. Xstr[4] = 0;
  2257. XMlist = (char **)str;
  2258. X}
  2259. X
  2260. Xchar *mpush(bytes)
  2261. X{
  2262. Xchar *str;
  2263. X
  2264. Xstr = malloc(6 + bytes + 2); /* may need extra 2 bytes in do_run() */
  2265. X*(char ***)str = Mlist;
  2266. Xstr[4] = 1;
  2267. XMlist = (char **)str;
  2268. Xreturn (str + 5);
  2269. X}
  2270. X
  2271. Xmpop_tobase()
  2272. X{
  2273. Xregister char *next;
  2274. X
  2275. Xwhile (Mlist) {
  2276. X    next = *Mlist;
  2277. X    if (((char *)Mlist)[4] == 0) {
  2278. X        free (Mlist);
  2279. X        Mlist = (char **)next;
  2280. X        break;
  2281. X    }
  2282. X    free (Mlist);
  2283. X    Mlist = (char **)next;
  2284. X    }
  2285. X}
  2286. X
  2287. X/*
  2288. X * Insert 'from' string in front of 'str' while deleting the
  2289. X * first entry in 'str'.  if freeok is set, then 'str' will be
  2290. X * free'd
  2291. X */
  2292. X
  2293. Xchar *format_insert_string(str, from, freeok)
  2294. Xchar *str;
  2295. Xchar *from;
  2296. Xint *freeok;
  2297. X{
  2298. Xregister char *new1, *new2;
  2299. Xregister unsigned char *strskip;
  2300. Xint len;
  2301. X
  2302. Xfor (strskip = (unsigned char *)str;
  2303. X        *strskip && *strskip != ' ' 
  2304. X        && *strskip != ';' && *strskip != '|'
  2305. X        && *strskip != 0x80; ++strskip);
  2306. Xlen = strlen(from);
  2307. Xnew1 = malloc((len << 2) + 2);
  2308. Xpreformat(from, new1);
  2309. Xlen = strlen(new1) + strlen(strskip);
  2310. Xnew2 = malloc(len+2);
  2311. Xstrcpy(new2, new1);
  2312. Xstrcat(new2, strskip);
  2313. Xnew2[len+1] = 0;
  2314. Xfree (new1);
  2315. Xif (*freeok) free (str);
  2316. X*freeok = 1;
  2317. Xreturn new2;
  2318. X}
  2319. X
  2320. Xcmd_stat(str)
  2321. Xchar *str;
  2322. X{
  2323. Xreturn(Command[find_command(str)].stat);
  2324. X}
  2325. X
  2326. Xfind_command(str)
  2327. Xchar *str;
  2328. X{
  2329. Xregister unsigned short i;
  2330. Xint len = strlen(str);
  2331. X
  2332. Xif (*str<'a' || *str>'z') return 0;
  2333. Xfor (i = 0; Command[i].func; ++i)
  2334. X    if ( ! strncmp(str, Command[i].name, len)) return (int)i;
  2335. Xreturn 0;
  2336. X}
  2337. X
  2338. Xdo_help()
  2339. X{
  2340. Xregister struct COMMAND *com;
  2341. Xint i=0;
  2342. X
  2343. Xfor (com = &Command[1]; com->func; ++com) {
  2344. X    printf ("%-12s", com->name);
  2345. X    if (++i % 6 == 0) printf("\n");
  2346. X    }
  2347. Xprintf("\n");
  2348. Xreturn 0;
  2349. X}
  2350. X
  2351. Xchar *push_cpy(s)
  2352. Xchar *s;
  2353. X{
  2354. Xreturn strcpy(mpush(strlen(s)), s);
  2355. X}
  2356. END_OF_FILE
  2357. if test 16435 -ne `wc -c <'src/execom.c'`; then
  2358.     echo shar: \"'src/execom.c'\" unpacked with wrong size!
  2359. fi
  2360. # end of 'src/execom.c'
  2361. fi
  2362. echo shar: End of archive 2 \(of 3\).
  2363. cp /dev/null ark2isdone
  2364. MISSING=""
  2365. for I in 1 2 3 ; do
  2366.     if test ! -f ark${I}isdone ; then
  2367.     MISSING="${MISSING} ${I}"
  2368.     fi
  2369. done
  2370. if test "${MISSING}" = "" ; then
  2371.     echo You have unpacked all 3 archives.
  2372.     rm -f ark[1-9]isdone
  2373. else
  2374.     echo You still need to unpack the following archives:
  2375.     echo "        " ${MISSING}
  2376. fi
  2377. ##  End of shell archive.
  2378. exit 0
  2379. -- 
  2380. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  2381. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  2382. Post requests for sources, and general discussion to comp.sys.amiga.misc.
  2383.